from django import template
from django.db.models import Count

from blog.models import Post, Category

# 创建模板库对象
register = template.Library()


# 将函数 get_recent_posts添加到模板中
@register.simple_tag
def get_recent_posts(num=5):
    """最新文章"""
    return Post.objects.all().order_by('-created_time')[:num]


@register.simple_tag
def get_archives():
    """归档"""
    return Post.objects.dates('created_time', 'month', order='DESC')


"""
- Category.objects.annotate 方法和 Category.objects.all 类似，返回数据库中全部
  Category 的记录，但它会做额外的事情: 统计每个Category 的文章数。
- Count 方法，接收一个和 Categoty 相关联的模型参数名（这里是 Post ，通过 ForeignKey 关联
  的），统计 Category 记录的集合中每条记录下的与之关联的 Post 记录的行数，也就是文章数，
  最后把这个值保存到 num_posts 属性中。
- filter 方法把 num_posts 的值小于 1 的分类过滤掉。因为 num_posts 的值小于 1 表示该分
  类下没有文章，没有文章的分类我们不希望它在页面中显示。
"""
@register.simple_tag
def get_categories():
    """分类"""
    # return Category.objects.all()
    # Count 计算分类下的文章数，其接受的参数为需要计数的模型的
    return Category.objects.annotate(num_posts=Count('post')).filter(num_posts__gt=0)